<?php
/**
 * 员工档案控制器
 */

declare (strict_types = 1);

namespace app\controller\user;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;

class Archives extends BaseController
{
    /**
     * 无需登录的方法
     * @var array
     */
    protected $noNeedLogin = ['list', 'view'];
    
    /**
     * 查看员工档案列表
     * 以oa_admin为主表，整合员工档案数据后返回
     */
    public function list()
    {
        $param = Request::param();
        $page = isset($param['page']) ? (int)$param['page'] : 1;
        $limit = isset($param['limit']) ? (int)$param['limit'] : 10;
        
        try {
            $where = [];
            $where[] = ['a.status', '>', 0]; // 只查询有效的员工
            
            // 按员工姓名筛选
            if (!empty($param['name'])) {
                $where[] = ['a.name', 'like', '%' . $param['name'] . '%'];
            }
            
            // 按部门ID筛选
            if (!empty($param['department_id'])) {
                $where[] = ['a.did', '=', $param['department_id']];
            }
            
            // 查询员工档案列表
            // 以oa_admin为主表，关联部门表和职位表
            $list = Db::name('admin')
                ->alias('a')
                ->join('department d', 'a.did = d.id', 'LEFT')
                ->join('position p', 'a.position_id = p.id', 'LEFT')
                ->field([
                    'a.id as employee_id',
                    'a.name as employee_name',
                    'a.job_number',
                    'a.entry_time',
                    'a.education',
                    'a.speciality',
                    'a.work_date',
                    'a.did',
                    'd.title as department_name',
                    'p.title as position_name',
                    'a.create_time',
                    'a.update_time',
                    // 添加用户类型字段，用于区分律师和其他员工
                    'a.user_type'
                ])
                ->where($where)
                ->page($page, $limit)
                ->order('a.id', 'asc')
                ->select()
                ->each(function ($item) {
                    // 处理入职时间格式
                    $item['entry_date'] = $item['entry_time'] > 0 ? date('Y-m-d', $item['entry_time']) : '';
                    // 计算工作年限
                    $item['work_years'] = $item['work_date'] > 0 ? date('Y') - date('Y', $item['work_date']) : 0;
                    return $item;
                });
            
            // 查询总数
            $count = Db::name('admin')
                ->alias('a')
                ->where($where)
                ->count();
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => [
                    'list' => $list,
                    'total' => $count,
                    'page' => $page,
                    'limit' => $limit
                ],
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取失败: ' . $e->getMessage()]);
        }
    }

    /**
     * 查看单个员工档案详情
     * 根据员工类型查询不同的档案信息
     */
    public function view()
    {
        $id = Request::param('id');
        if (empty($id)) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }

        try {
            // 先查询员工基本信息，关联部门表和职位表
            $admin = Db::name('admin')
                ->alias('a')
                ->join('department d', 'a.did = d.id', 'LEFT')
                ->join('position p', 'a.position_id = p.id', 'LEFT')
                ->field([
                    'a.*',
                    'd.title as department_name',
                    'p.title as position_name'
                ])
                ->where('a.id', $id)
                ->find();
                
            if (empty($admin)) {
                return json(['code' => 404, 'msg' => '员工不存在']);
            }

            // 根据用户类型查询不同的档案信息
            if ($admin['user_type'] == 2) {
                // 律师用户，查询oa_lawyer表
                $profile = Db::name('lawyer')->where('admin_id', $id)->find();
                $profileType = 'lawyer';
            } else {
                // 普通员工，直接使用oa_admin表中的信息
                $profile = [];
                $profileType = 'admin';
            }

            // 合并员工信息和档案信息
            $data = array_merge($admin, $profile);

            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $data,
                'profile_type' => $profileType, // 返回档案类型，前端可根据此类型显示不同字段
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '获取失败: ' . $e->getMessage()]);
        }
    }

    /**
     * 编辑员工档案
     * 根据员工类型更新不同的档案表
     */
    public function edit()
    {
        $param = Request::param();
        $id = isset($param['id']) ? (int)$param['id'] : 0;
        
        if (empty($id)) {
            return json(['code' => 400, 'msg' => '参数错误']);
        }

        try {
            // 先查询员工基本信息
            $admin = Db::name('admin')->where('id', $id)->find();
            if (empty($admin)) {
                return json(['code' => 404, 'msg' => '员工不存在']);
            }

            // 根据用户类型更新不同的档案信息
            if ($admin['user_type'] == 2) {
                // 律师用户，更新oa_lawyer表和oa_admin表
                $lawyerData = [
                    'update_time' => time()
                ];
                
                // 从参数中提取oa_lawyer表相关的字段
                $lawyerFields = [
                    'name', 'email', 'mobile', 'sex', 'firmid', 'firm_name', 'type', 
                    'idcard', 'lawyer_license', 'provinceid', 'cityid', 'distid',
                    'education', 'honor', 'adept', 'desc', 'entry_time'
                ];
                
                foreach ($lawyerFields as $field) {
                    if (isset($param['lawyer_' . $field])) {
                        $lawyerData[$field] = $param['lawyer_' . $field];
                    }
                }
                
                Db::name('lawyer')->where('admin_id', $id)->save($lawyerData);
                
                // 同时更新oa_admin表中的基本信息
                $adminData = [
                    'update_time' => time()
                ];
                
                $adminFields = [
                    'name', 'email', 'mobile', 'sex', 'thumb', 'provinceid', 'cityid'
                ];
                
                foreach ($adminFields as $field) {
                    if (isset($param[$field])) {
                        $adminData[$field] = $param[$field];
                    }
                }
                
                Db::name('admin')->where('id', $id)->save($adminData);
            } else {
                // 普通员工，只更新oa_admin表
                $adminData = [
                    'update_time' => time()
                ];
                
                // 从oa_admin表中可以直接更新的字段
                $adminFields = [
                    'name', 'email', 'mobile', 'sex', 'thumb', 'did', 'position_id',
                    'job_number', 'birthday', 'age', 'work_date', 'native_place',
                    'nation', 'home_address', 'current_address', 'contact',
                    'contact_mobile', 'resident_type', 'resident_place',
                    'graduate_school', 'graduate_day', 'political', 'marital_status',
                    'idcard', 'education', 'speciality', 'social_account',
                    'provident_account', 'bank_account', 'bank_info', 'desc',
                    'entry_time', 'provinceid', 'cityid'
                ];
                
                foreach ($adminFields as $field) {
                    if (isset($param[$field])) {
                        $adminData[$field] = $param[$field];
                    }
                }
                
                Db::name('admin')->where('id', $id)->save($adminData);
            }

            return json([
                'code' => 0,
                'msg' => '编辑成功',
                'timestamp' => time()
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '编辑失败: ' . $e->getMessage()]);
        }
    }

    /**
     * 删除员工档案（已禁用）
     */
    public function del()
    {
        return json(['code' => 400, 'msg' => '档案不允许删除']);
    }

    /**
     * 新增员工档案（已禁用）
     */
    public function add()
    {
        return json(['code' => 400, 'msg' => '档案在员工创建时自动生成，不允许新增']);
    }
}